
function indexOf(str, v) {
   if (str.indexOf(v) < 0) { return false; } else { return true; }
 }
 
 function get_pos(){//获取位置
   console.log('获取经纬度')
   return new Promise((resolve, reject) => {
     wx.getLocation({
       type: 'gcj02',
       isHighAccuracy:'true',
       success (res) {
         console.log('位置信息',res)
         res.err='ok';
         resolve(res);
       },
       fail(res){
          console.log(res)
         res.err='fail';
         resolve(res);
       },complete(res){
          console.log(res)
         resolve(res);
       }
      })
   });
 }
 

 function clean_marker(marker){//清理marker
   return new Promise((resolve, reject) => {
      for(var i in marker){
         var id=parseInt(marker[i].id)
         //console.log('id',i,id)
         if(id>100 && id<888){
            delete marker[i];
           // marker.splice(i,1);
         }else{
            console.log('aaa',i)
         }
         }
     
      console.log(marker)
         resolve(marker);
   });


}


 function get(data){
   var app = getApp();
   if(!data){data={};}
   data.user_id=app.globalData.user_id;if(!data.user_id){data.user_id=0;}
   data.session=app.globalData.session;if(!data.session){data.session='';}
   data.adm_id=app.globalData.adm_id;if(!data.adm_id){data.adm_id=0;}
   data.adm_session=app.globalData.adm_session;if(!data.adm_session){data.adm_session='';}
   data.from_id=app.globalData.from_id;if(!data.from_id){data.from_id=0;}
   data.user_session=app.globalData.user_session;
   data.from=app.globalData.from;if(!data.from){data.from='';}
   data.latitude=app.globalData.latitude;if(!data.latitude){data.latitude=0}
   data.longitude=app.globalData.longitude;if(!data.longitude){data.longitude=0}
   var timestep=(new Date()).getTime();
   var sign=md5(app.globalData.sign+timestep);
   data.timestep=timestep;
   data.xsign=sign;
   data.token=sign;
   console.log(data)
   return new Promise((resolve, reject) => {
 wx.request({
   url: app.globalData.server+'/server.php',
   header:{'content-type':'application/x-www-form-urlencoded'},
   method:'POST',
   enableHttp2:true,
   data:data,success(res){
 if(!res.data){console.log('没有返回数据');return;}console.log(res.data)
 if(res.data.err!='ok'){ 
   if(typeof res.data=='string'){
 if(res.data.indexOf('404 Not Found')!=-1){app.err('服务器页面丢失，请联系管理员处理');return;} 
 }
 if(res.data.direct && res.data.url){wx.navigateTo({url: '/pages/login/index',});resolve({err:'no_login'});return;}//跳转页面
 if(res.data.err=='no_login'){
   app.globalData.session='';
   app.globalData.user_id=0;
   login().then(res=>{
      console.log('返回数据',res,data,res.user.session)
      if(res.err=='ok'){
        app.globalData.session=res.user.session;
       app.globalData.user_id=res.user.id;
         resolve({err:'no_login'});
         return;
         //app.globalData.get_data_times=1;
      }else{
         console.log('go_to_login')
         wx.navigateTo({url: '/pages/login/index',});resolve({err:'no_login'});return;
      }
   });
  return;
}
 if(res.data.err=='adm_login'){wx.navigateTo({url: '/pages/login/adm_login',});resolve({err:'no_login'});return;}
 if(res.data.err!=''){app.err(res.data.err);return;}
 } 
 if(res.data.need_login==1){//需要登录
   console.log('进行登录')
   app.globalData.session='';
   app.globalData.user_id=0;
   login().then(res=>{console.log(res)});
 }

 if(res.data.err_msg){
   app.err(res.data.err_msg)
 }
     resolve(res.data)
   },fail(res){
     console.log('错误',res)
   }
 })
   });
 }
 
 function get_phone(data) {//获取手机号码
   var app = getApp()
   return new Promise((resolve, reject) => {
     wx.login({
       success(res) {
         console.log('获取手机号码',res,data);
         var timestep=(new Date()).getTime();
         var sign=md5(app.globalData.sign+timestep);
       

             wx.request({
               url: app.globalData.server+'server.php', // 目标服务器url
               data: {
                 ac: 'get_phone',
                 header:{'content-type':'application/x-www-form-urlencoded'},
                 method:'POST',
                 encryptedData:encodeURIComponent(data.encryptedData) ,
                 iv: data.iv,
                 code: res.code,
                 adm:app.globalData.adm?app.globalData.adm:0,
                 timestep:timestep,
                 xsign:sign
               },
               success: (res) => {console.log(res.data)
                 if (!res.data.err_code) {
                   resolve(res.data)
                 } else {app.msg('获取失败，请重新获取');
                   console.log('获取失败',res.data);
                 }
               }
             }); 
           },
 
       fail(res) {
         console.log(`login调用失败`);
       }
     });
   });
 }
 
 function go_login() {
   var app = getApp()
   return new Promise((resolve, reject) => {
     wx.getUserProfile({
       desc: '微信登录',
       success: res => {
          console.log('登录信息',res)
        app.globalData.userInfo=res.userInfo;
        wx.login({
         success(res) {
           console.log('login code',res);
           var timestep=(new Date()).getTime();
           var sign=md5(app.globalData.sign+timestep);
               wx.request({
                 url: app.globalData.server+'server.php', // 目标服务器url
                 header:{'content-type':'application/x-www-form-urlencoded'},
                 method:'POST',
                 data: {
                   ac: 'wx_login',
                   nickName: app.globalData.userInfo.nickName,
                   logo: app.globalData.userInfo.avatarUrl,
                   city: app.globalData.userInfo.city,
                   province: app.globalData.userInfo.province,
                   encryptedData: res.encryptedData,
                   iv: res.iv,
                   sign: res.signature, 
                   code: res.code,
                   from_id: app.globalData.from_id ? app.globalData.from_id : 0,
                   user_session:app.globalData.user_session?app.globalData.user_session:0,
                   timestep:timestep,
                   xsign:sign,
                   region:app.globalData.region?JSON.stringify(app.globalData.region):''
                 },
                 success: (res) => {console.log(res.data)
                   if (res.data.err == 'ok') {
                     app.globalData.user_id = res.data.id;
                     app.globalData.session = res.data.session;
                     app.globalData.user_info = res.data;
                     res.data.user_id = res.data.id;
                     console.log('登录成功')
                     try {
                       wx.setStorageSync('login_info', JSON.stringify(res.data))
                     } catch (e) { }
                     resolve('ok')
                   } else {
                     console.log('登录错误',res.data);
                     app.msg('登录错误:'+res.data.err);
                   }
                 }
               }); 
             },
   
         fail(res) {
           console.log(`login调用失败`);
         }
       });
 
       }
     })
   });
 }
 
 
 
 function get_time(start,end){
 var time=end-start;if(time<0){return 0;}
 var h='';
 var day=Math.floor(time/(3600*24));
 if(day){h+=day+'天';time=time-day*3600*24;}
 var hour=Math.floor(time/3600);
 if(hour){h+=hour+'时';time=time-hour*3600;}
 var minit=Math.floor(time/60);
 if(minit){h+=minit+'分';time=time-minit*60;}
 h+=time+'秒';
 return h;
 }
 
 function number_fromat(num, n) {
   var nn = parseFloat(num);
   return nn.toFixed(n);
 }
 
 function get_dis(lat1,long1,lat2,long2,acs){//获取两地距离
  // console.log(lat1,long1,lat2,long2)
 var earch=6370.996;
 var pi=3.1415926;
 var r1=lat1*pi/180;
 var r2=lat2*pi/180;
 var l1=long1*pi/180;
 var l2=long2*pi/180;
 var a=r1-r2;
 var b=l1-l2;
// console.log(a,b);
 var cc=Math.pow(Math.sin(a/2),2)+Math.cos(r1)*Math.cos(r2)*Math.pow(Math.sin(b/2),2);
 //console.log(cc);
 var dis=2*Math.asin(Math.sqrt(cc));
 var dis=Math.ceil(dis*earch*1000);
 //console.log(dis);
 if(acs==1){return dis;}
 if(dis>1000){
 return number_fromat(dis/1000,2)+'千米';
 }else{
 return number_fromat(dis,1)+'米';
 }
 }
 
 function q(id){ return new Promise((resolve, reject) => {
 const query = wx.createSelectorQuery();
 query.select(id).boundingClientRect();
 query.selectViewport().scrollOffset();
 query.exec(function(res){
   resolve(res)
 });
 });
 }
 
 function is_phone(num){
   let reg = /^[1][3456789]\d{9}$/;
   ///^[1][3456789]\d{9}$/;
   return reg.test(num);
 }
 
 function scan(){//扫描二维码
   wx.scanCode({
     onlyFromCamera: true,success(res){
       console.log(res)
       var that=this;
   switch(res.scanType){
   case 'QR_CODE'://二维码
   //console.log(res.result)
   var r=res.result.split('|');
 switch(r[0]){
   default://默认
   wx.navigateTo({
     url: r[0],
   })
   break;
   case 'go'://跳转页面
   wx.navigateTo({
     url: r[1],
   })
   break;
   case 'rgo':
   wx.redirectTo({
     url: r[1],
   })
   break;
   case 'home':
   wx.reLaunch({
     url: '/pages/index/index',
   })  
   break;
   case 'ac'://命令
   eval(r[1])
   break;
   case 'help'://显示帮助
   wx.navigateTo({
     url: '/pages/help/index?'+r[1],
   })
   break;
 }
   break;//qrcode
   case 'WX_CODE'://小程序码
   if(res.result=='*'){
     wx.showModal({
       title: '错误',content:'抱歉，您扫描的小程序码有误！'
     })
     return;}
  var val=res.path.split('?scene=');
  var url=val[0];
  var query=val[1];if(!query){query='';}
  if(query){
    if(query.indexOf('%')==-1){query=encodeURIComponent(query)}
  }
   wx.redirectTo({
     url: '/'+url+'?scene='+query,
   })
   break;
 
   }
   
     }
   })
 }
 
 function rand(max){
  return Math.floor(Math.random() * max)
 }
 
 function view_add(ac){//添加浏览情况
 if(!ac){return}var app = getApp();
 if(!app.globalData.view){app.globalData.view=[]}
 app.globalData.view.push({ac:ac,time:(new Date()).getTime()});
 }
 
 
 function scrollTo(item,time) {
   if(!time){time=0;}
    wx.createSelectorQuery().select(item).boundingClientRect(res => {
      wx.pageScrollTo({
        scrollTop: res.top, 
        duration: time 
      })
    }).exec()
 }
 
 
 function upload(data){//获取位置
    var app = getApp();
    var user_id=app.globalData.user_id;
    var session=app.globalData.session;
    var timestep=(new Date()).getTime();
    var sign=md5(app.globalData.sign+timestep);
    return new Promise((resolve, reject) => {
       const uploadTask = wx.uploadFile({
          url: app.globalData.server+'/server.php',
          filePath:data['tempFilePath'],
          name: 'file',
          formData:{
            ac:data.ac?data.ac:'upload_file',user_id:user_id,session:session,size:data['size'],id:data.id,c:data.c?data.c:'',name:data['tempFilePath'],timestep:timestep,xsign:sign
          },
          success (res){
            console.log('成功',res.data);
            var x=''
          if(res.data){
              x=res.data.split('||');
          }
           
            if(x[0]=='ok'){
            resolve({err:'ok',id:x[1],img:x[2],img_240:x[3],img_480:x[4],img_750:x[5],img_id:x[6]});
          }else{
            var re=JSON.parse(res.data) 
            resolve(re)}
          }
        })
        
        //uploadTask.onProgressUpdate((res) => {
          //resolve(res.progress);
          //console.log('上传进度', res.progress)
        //  console.log('已经上传的数据长度', res.totalBytesSent)
         // console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
       // })
    });
  }
 
  function safe_add(x, y) {
   var lsw = (x & 0xFFFF) + (y & 0xFFFF),
      msw = (x >> 16) + (y >> 16) + (lsw >> 16);
   return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left.
*/
function bit_rol(num, cnt) {
   return (num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the four basic operations the algorithm uses.
*/
function md5_cmn(q, a, b, x, s, t) {
   return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md5_ff(a, b, c, d, x, s, t) {
   return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t) {
   return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t) {
   return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t) {
   return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Calculate the MD5 of an array of little-endian words, and a bit length.
*/
function binl_md5(x, len) {
   /* append padding */
   x[len >> 5] |= 0x80 << (len % 32);
   x[(((len + 64) >>> 9) << 4) + 14] = len;

   var i, olda, oldb, oldc, oldd,
      a = 1732584193,
      b = -271733879,
      c = -1732584194,
      d = 271733878;

   for (i = 0; i < x.length; i += 16) {
      olda = a;
      oldb = b;
      oldc = c;
      oldd = d;

      a = md5_ff(a, b, c, d, x[i], 7, -680876936);
      d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
      c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
      b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
      a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
      d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
      c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
      b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
      a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
      d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
      c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
      b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
      a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
      d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
      c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
      b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);

      a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
      d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
      c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
      b = md5_gg(b, c, d, a, x[i], 20, -373897302);
      a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
      d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
      c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
      b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
      a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
      d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
      c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
      b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
      a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
      d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
      c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
      b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);

      a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
      d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
      c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
      b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
      a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
      d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
      c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
      b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
      a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
      d = md5_hh(d, a, b, c, x[i], 11, -358537222);
      c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
      b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
      a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
      d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
      c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
      b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);

      a = md5_ii(a, b, c, d, x[i], 6, -198630844);
      d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
      c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
      b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
      a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
      d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
      c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
      b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
      a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
      d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
      c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
      b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
      a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
      d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
      c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
      b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);

      a = safe_add(a, olda);
      b = safe_add(b, oldb);
      c = safe_add(c, oldc);
      d = safe_add(d, oldd);
   }
   return [a, b, c, d];
}

/*
* Convert an array of little-endian words to a string
*/
function binl2rstr(input) {
   var i,
      output = '';
   for (i = 0; i < input.length * 32; i += 8) {
      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
   }
   return output;
}

/*
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*/
function rstr2binl(input) {
   var i,
      output = [];
   output[(input.length >> 2) - 1] = undefined;
   for (i = 0; i < output.length; i += 1) {
      output[i] = 0;
   }
   for (i = 0; i < input.length * 8; i += 8) {
      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
   }
   return output;
}

/*
* Calculate the MD5 of a raw string
*/
function rstr_md5(s) {
   return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}

/*
* Calculate the HMAC-MD5, of a key and some data (raw strings)
*/
function rstr_hmac_md5(key, data) {
   var i,
      bkey = rstr2binl(key),
      ipad = [],
      opad = [],
      hash;
   ipad[15] = opad[15] = undefined;
   if (bkey.length > 16) {
      bkey = binl_md5(bkey, key.length * 8);
   }
   for (i = 0; i < 16; i += 1) {
      ipad[i] = bkey[i] ^ 0x36363636;
      opad[i] = bkey[i] ^ 0x5C5C5C5C;
   }
   hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
   return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}

/*
* Convert a raw string to a hex string
*/
function rstr2hex(input) {
   var hex_tab = '0123456789abcdef',
      output = '',
      x,
      i;
   for (i = 0; i < input.length; i += 1) {
      x = input.charCodeAt(i);
      output += hex_tab.charAt((x >>> 4) & 0x0F) +
         hex_tab.charAt(x & 0x0F);
   }
   return output;
}

/*
* Encode a string as utf-8
*/
function str2rstr_utf8(input) {
   return unescape(encodeURIComponent(input));
}

/*
* Take string arguments and return either raw or hex encoded strings
*/
function raw_md5(s) {
   return rstr_md5(str2rstr_utf8(s));
}
function hex_md5(s) {
   return rstr2hex(raw_md5(s));
}
function raw_hmac_md5(k, d) {
   return rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d));
}
function hex_hmac_md5(k, d) {
   return rstr2hex(raw_hmac_md5(k, d));
}

/** 
 * 暴露接口给小程序 因为export default，所以引入的时候可以自定义方法名称 
 * +--------------------
 * @param {String}   string  需要加密的字符串
 * @param {String}   key     加密key
 * @param {Boolean}  raw     规则 false: 返回hex_md5, true: 返回raw_md5
 */
function md5(string, key, raw) {
   if (!key) {
      if (!raw) {
         return hex_md5(string);
      }
      return raw_md5(string);
   }
   if (!raw) {
      return hex_hmac_md5(key, string);
   }
   return raw_hmac_md5(key, string);
}

function get_phone_num(string){
   if(!string){return}
   console.log(string.length)
   if(string.length<=20){return;}
   var est=/\d{11}/g;
var string2=string.match(est);
var re=''
for(var i=0;i<string2.length;i++){
//判断是否符合要求   ^[1]是从1开始的意思  [358]表示符合这3个数的的第二位数 \d$ 表示以数字结尾 {9}表示出现9次
    var cox=/^[1][3456789]\d{9}$/;
    if (cox.test(string2[i])==true ) {
        console.log(string2[i]);
        if(!re){re= string2[i];}
        
    }
}
return re;
}

function login(id){
   var app = getApp();
   if(!id){id=0}
   return new Promise((resolve, reject) => {
      if(app.globalData.user_id && app.globalData.session){
         console.log('已经登录')
         resolve({err:'ok',user:app.globalData.userInfo})
         return}
   wx.login({
     success: (res) => {
      var timestep=(new Date()).getTime();
      var token=md5(app.globalData.sign+timestep);
      console.log(res)
      wx.request({
         url: app.globalData.server+'server.php', // 目标服务器url
         header:{'content-type':'application/x-www-form-urlencoded'},
         method:'POST',
         data: {
           ac: 'wx_check_login',
           code: res.code,
           from_id: app.globalData.from_id ? app.globalData.from_id : 0,
           user_session:app.globalData.user_session?app.globalData.user_session:0,
           timestep:timestep,
           token:token,
           id:id
         },
         success: (res) => {console.log(res.data)
           if (res.data.err == 'ok' && res.data.user) {
             app.globalData.get_data_times=0;
             app.globalData.user_id = res.data.user.id;
             app.globalData.session = res.data.user.session;
             app.globalData.user_info = res.data.user;
             res.data.user.user_id = res.data.user.id;
             console.log('登录成功',res.data.user)
             try {
               wx.setStorageSync('login_info', JSON.stringify(res.data.user))
             } catch (e) { }
             resolve({err:'ok',user:res.data.user,is_new:res.data.is_new})
           } else {
             console.log('登录错误',res.data);
             //app.msg('登录错误:'+res.data.err);
           }
         }
       }); 
   
     },
   })
   });
   
   }

   function file_read(path){
      const fs = wx.getFileSystemManager();
      return new Promise((resolve, reject) => {
      fs.readFile({
         filePath: path,
         encoding: 'base64',
         position: 0,
         success(res) {
          // console.log(res.data);
           resolve(res.data);
           
         },
         fail(res) {
           console.error(res)
         }
       })
      });
       
   }
 module.exports = { indexOf: indexOf, number_fromat: number_fromat, go_login: go_login,get_dis:get_dis,get:get,q:q,get_time:get_time,is_phone:is_phone,get_phone:get_phone,get_pos:get_pos,scan:scan,rand:rand,view_add:view_add,scrollTo:scrollTo,upload:upload,md5:md5,get_phone_num:get_phone_num,clean_marker:clean_marker,login:login,file_read:file_read}
 